package com.cskaoyan.javase.oop.block9.exercise5;
/**
 * @description: 代码块练习题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/
/**
 * 程序的执行结果是什么？
 * 1，看程序说结果题，永远的第一步：找main方法
 *
 */
public class ExerciseBlock {
    //1，类加载静态代码块执行了，所以这里最先输出
    static {
        System.out.println("main方法静态代码块！");
    }
    {
        System.out.println("main方法构造代码块！");
    }
    //main方法会触发这个类的类加载
    public static void main(String[] args) {
        //2，类加载完毕后，输出这里
        System.out.println("main方法开始执行！");
        //3，这里创建类Star对象，立刻马上找个这个构造方法
        Star s = new Star(18,"马化腾");
        //19，构造器已经调用结束了，于是开始执行后面的代码
        System.out.println(Star.name);
        System.out.println(s.age);
    }
}
class Star{
    //12，执行构造代码块,打印name=杨超越
    {
        age = 18;
        Star.name = "杨超越";
        System.out.println("我喜欢杨超越");
    }
    //5，初始化静态成员name，null--->王菲
    static String name = "王菲";
    //11，默认初始化成员变量 age = 0
    //13，给age赋值 age = 28;
    int age = 28;
    //6，执行静态代码块，name=杨幂，打印我喜欢杨幂
    static {
        name = "杨幂";
        System.out.println("我喜欢杨幂");
    }
    //4，找到了这个构造方法，然后它不会执行，因为要类加载
    //7，现在类加载结束了，开始创建对象
    public Star(int age,String name) {
        //8，它一看这里有个this调用别的构造方法，于是它去找this构造器
        this(age);
        //19，this构造器执行完毕，开始执行创建对象的那个构造器
        //打印了age，name构造器
        System.out.println("age,name：构造器！");
        //给name赋值 name = 马化腾
        Star.name = name;
        //又给name赋值 = 刘亦菲
        Star.name = "刘亦菲";
    }
    //9，找个这个构造器
    public Star(int age) {
        //10，不是立刻执行该构造器，而是初始化普通的成员变量，执行构造代码块
        //14,普通的成员变量已经初始化完毕，开始执行this构造器
        //打印age 构造器
        //并且给age 赋值 age = 18
        System.out.println("age：构造器！");
        this.age = age;
    }
    public Star() {
    }
}
